% -*- coding: utf-8 -*-
% Ada 95 品质和风格
% 版权所有 (C) 2009, 朱群英
% Copyright (C) 2009, Zhu Qun-Ying
%
% 本书的 TeX 代码和由之生成的 ps，pdf，html，等其他格式的文件
% 遵循 GNU通用公共授权第三版或其后的版本。
%
% 本书是基于有益的目的而加以发布，然而不负任何担保责任。
%
% 您应已收到附随于本书的GNU通用公共授权的副本；如果没有，
% 请参考 <http://www.gnu.org/licenses/gpl.html>

\chapter{导言}
\label{c:introduction}
\pagenumbering{arabic}
\pagestyle{fancy}

风格这个写作的重要属性往往被忽略，而写作的风格直接影响最后作品的可读性和
可理解性。 编程的风格，即使用某个电脑编程语言书写源程序，也受到相当的忽视。
程序不仅仅需要被机器读懂，还要被人读并易于理解。这个需求对生产高质量的产品
同样重要，即在预算内按时按质完成符合客户要求的产品。本书试图帮助电脑专业人员
写出更好的 Ada 程序。本书呈现给读者一套有针对性的风格准则，从而 Ada 95 
\cite{arm95}的强大功能可以在遵守一些规则下使用。

每个\glemph{准则}都简明叙述了应遵守的规则以及从\glemph{原理}上解释其原因。
大多数情况下，都会有一个使用该准则的\glemph{范例}，某些情况下，还会有进一步
的范例来显示不遵守准则的后果。所有可能的使用上的\glemph{异例}都会特
别指出，如果可能，会有进一步的\glemph{注解}。某些情况下，会使用一个
\glemph{具体事例}来进一步呈现更加精确的准则，从而可以作为标准实施。某些特
别选出来的情况，\glemph{自动化注解}会探讨怎样自动实施这个准则。

Ada 当初被设计为支持开发高质量、可靠、可重用、可移植的软件。由于各种原因，
没有程序语言可以只凭自己本身来保证达到这些目的。例如，编程必须嵌入在一个
有序的开发流程，从而分析需求，设计，实现，查验，确认和维护得以井然有序。
从获得好评的软件工程规约中总结出的好的编程实践在语言的使用中必须遵守。
本书试图在工程规约和 Ada 实际编程中的差异架起桥梁。

本书中的许多准则都为促进源代码的清晰而设。这些准则的目标是提高程序的演变、
改写和维护的容易度。可理解的源代码，使其看起来正确和可靠的可能性更高。
代码的改写要求对程序有完整的理解，清晰的代码对于理解有相当的帮助。有效的
代码改写是代码重用不可缺的条件, 而代码的重用有大幅降低系统开发成本的潜力。
最后，系统使用期间的维护(实际上是演变)是个持续的昂贵过程, 清晰的代码在维持
较低的维护成本上起了主要作用。 在整个系统的生命周期中，代码被阅读和理解的次数
大大多于编写，所以投资在代码的可读性和可理解性上是值得的。

在本章剩下的小节中，总结了一下本书的结构和如何把呈现的内容给不同的角色使用，
如新的 Ada 程序员，有经验的 Ada 程序员，面向对象的程序员，项目经理，承包商，
标准制定组织，从现有的 Ada 83\cite{arm83} 程序过渡到 Ada 95 的计划者。
 
\section{本书的结构}
本书的格式遵循受到广泛欢迎的
\href{http://archive.adaic.com/docs/style-guide/83style/html/}
{《Ada 品质和风格：专业程序员的准则》版本号
 02.01.01 (AQ\&S 83)} (软件生产力协会 1992) 中所用的格式。本指南根据程序员
为了写出高质量、可靠、可重用、可移植的 Ada 程序，所做出的各个重要决定，
进行分章描述。章节中某些部分会有所重复，因为不是所有的决定都可以独立做出。

本书对源代码的呈现、可读性、程序结构、并行性、可移植性、可重用性、
性能以及面向对象进行了分章阐述。 每一章都以一个本章准则的\glemph{总结}来结束。
最后一章呈现了一个完整的哲学家吃晚餐的实现，这个范例由 Michael B. Feldman 博士
和 Bjorn Kallberg 先生提供。这个范例中使用了本书中的许多准则。附录给出了一个
Ada 参考手册 (1995) 和本书中的准则之间的交互参照矩阵。

本书的用词是过去 20 年软件工程中发展出的通用词语。软件工程是个快速发展的领域，
有许多相对新的概念和术语。为了有个共通的参考框架，需要的定义会从 Ada 参考手册
(1995) 和 原理 (1995) 中取用。

本书多处引用了其他有关 Ada 风格和问题的文献和资料。相关的参考资料列表在书
的末尾。书末也提供了参考文献列表。

``Ada'' 这个专有名词在本书中是指在 1995 年 二月公布的最新 Ada 标准
\footnote{译者注：现在最新的标准是 Ada 2005 了。} (有时也用 Ada 95 来表示)。
引用早前的 Ada 标准都会清楚的注明``Ada 83''。

\subsection{源代码的呈现和可读性}
第\ref{c:src}章和第\ref{c:readability}章直接针对创作清晰、
可读、可理解源代码中遇到的问题。第\ref{c:src}章集中讨论代码的格式，
第\ref{c:readability}章解决运用注释、命名规则和类型的问题。

代码的清晰有两个主要的方面：(1) 第\ref{c:src}章涵盖
代码在页面和屏幕上谨慎而一致的\glemph{版面规划}, 可大幅提高代码的可读性；
(2) 第\ref{c:readability}章涵盖谨慎对待代码的\glemph{结构}，令代码易于理解。
这两方面即适合于小规模的应用 (例如小心挑选变量名或按规约使用循环)，也适合于
大规模的应用 (例如封装包的适当使用) 。

代码格式和命名规则的偏好是很个人的选择。你必须平衡好自己和项目中其他工程师的
喜好和厌恶，以确立一套全项目的人都要一致遵守的规约。自动代码格式器有助于实施
这类的规约以保持代码的一致。

\subsection{程序结构}
第\ref{c:prg-struct}章主讲程序的整体结构。适当的结构会提高程序的清晰度。
这相当于在底层的可读性上再包含高层结构的内容，特别是封装包 (package)、
子封装包 (child package) 的应用, 可见度和异常。本章大部分的准则都是有关于
软件工程中健全的原则，例如信息的隐藏、抽象、封装和关系的分离。

\subsection{编程实践}
第\ref{c:prg-prac}章的准则定义了语言功能使用上的一致性和逻辑性。
这些准则针对语法、类型、数据结构、表达式、语句、可见度、异常和执行错误中的
可选部分。

\subsection{并行性}
第\ref{c:concurrency}章定义了并行性的正确使用，从而开发出可预料、可靠、可重用、
可移植的软件。主题包括任务 (tasking)、被保护单元 (protected unit)、通信
以及终止。本版 Ada 语言的主要增强的一个方面就是更好的支持数据共享。
以前，唯一保护共享数据的方法是通过任务的机制。本章的准则支持使用保护类型
来封装和同步共享数据的访问。

\subsection{可移植性和可重用性}
第\ref{c:portability}章和第\ref{c:reusability}章讨论因着眼点的稍微不同而
引起的设计改变的问题。第\ref{c:portability}章探讨可移植性的基础，即软件很容易
从一个电脑系统或环境改到另一个系统或环境，以及某些特定功能的使用对可移植性的
影响。第\ref{c:reusability}章讨论代码的重用，即代码以最少改动可以使用的范围。

要特别注意第\ref{c:portability}章中讨论的准则。即使现在看不到软件产品的移植
需要，遵守这些准则还是很有必要的，这提高了软件在其它使用不同 Ada 实现的项
目中重用的可能。 当在某个项目中，某些准则必须被放松，你应该坚持
把不可移植部分的功能代码显著的标示出来。

第\ref{c:reusability}章中有关重用性的准则，是在封装和为变化设计的
原则基础上得出来的。即使并不预期会重用，这些准则强调了理解性和清晰，健壮性，
适应性和独立性是有益而最希望的，因为这样的代码更能对应计划和非计划的变化。

\subsection{面向对象的功能}
第\ref{c:obj-oriented}章用通用的面向对象的术语定义了一套准则，来开发 Ada 95 中
的某些新功能。这些准则讨论了 Ada 新功能的使用，包括类型扩展 (标签类型，tagged)、
抽象标签 (abstract tagged)类型、实现单一继承、多重继承和多形的抽象子程序。

\subsection{性能}
第\ref{c:perfomance}章定义了一套旨在提高性能的准则。大家都公认某些提高性能
的方法是和可维护性、可移植性相冲的。本章大多数的准则都含有这样的句子``当性能
的测量指出。'' ``指出''意味着，在你的系统中， 应用程序性能的提高带来的好处
超出其负面影响，即降低了源码的可理解性、可以维护性和可移植性。

\section{怎样使用本书}
本书适用于实际使用 Ada 进行软件系统开发的相关人员。下面的段落中讨论如合最有效
的利用本书中的内容。有不同程度的 Ada 经验的读者或软件项目中的不同角色要以
不同的方式使用本书。

本书有好几种使用的方法：作为好的 Ada 风格的指南；为更好的 Ada 程序作出贡献的
全面的准则列表；或者作为探讨语言中某些特定功能的使用范例或着设计折衷的参考
资料。本书包含了许多准则，某些还十分复杂。一般不大可能同时使用语言中的所有
功能，所以同时学习所有的准则并不是必须的。但是，推荐所有的程序员(如果可能，
所有 Ada 项目的员工) 都应该尽力去读懂第\ref{c:src}、
\ref{c:readabilty}、\ref{c:prg-struct}章，以及直到第\ref{c:prg-prac}章
的第\ref{s:prg-prac:visibility}节。某些内容比较困难 (例如第
\ref{s:prg-struct:visibility}节，讨论可见度)，但是它涵盖了有效使用 Ada 的
基础，这对任何构建 Ada 系统的相关专业人员很重要。

本书不是 Ada 语言的入门介绍，也不是全面的手册。本书假定您已经知道 Ada 的语法
以及对语义的基本理解。在这样的前提下， 您将发现这些准则是有益，
有教育性，通常还具启发性的。

如果您在学习 Ada，您最好让自己对语言的有个全面的入门了解。有两本不错的 Ada 83
入门书\cite{barnes89}和\cite{cohen86}。两位作者都出版了涵盖 Ada 95 的新书
(\cite{barnes96}、\cite{cohen96})。一旦你熟悉了这些内容，推荐您和
\cite{rational95}一起使用。《Ada 95 参考手册》\cite{arm95} 应当被视为这些书
的姊妹篇。大多数准则都会把《Ada 95 参考手册》中相关语言功能定义的段落和讨论
关联起来。附录\cite{a:cross-ref}列出了《Ada 95 参考手册》和本书中的准则之间
的交互参照。

\section{给新 Ada 程序员}
第一眼，Ada 提供的各类功能让人迷惑。 这个强大的工具是用来解决困难问题的，
几乎每个功能都有在某些场合下使用的合理性。这使得在一个规约而有组织的情况下
使用 Ada 的这些功能，变得特别重要。遵循这些准则让学习 Ada 变得简单些，
还能帮助你掌握她的复杂的功能。从一开始，你就可以用写程序来熟悉语言中的
最好功能，就像语言设计者预期的那样。

有使用其它语言经验的程序员经常陷入把 Ada 当成以前熟悉的语言来使用的情况，只是
用不同的恼人的语法。应该不惜代价来避免这个陷阱；它可能导致错综的代码而破坏了
让 Ada 恰恰成为适合建造高质量系统的方面。你必须学会用``Ada 思考''。遵循本书
的准则，参看范例的使用，会帮助你尽可能快而不痛苦的学会用 Ada 思考。 

从某些角度来说，无经验的程序员学习 Ada 有优势。从一开始就遵循这些准则，
有助于养成清晰的编程风格和有效的活用语言。如果你属于这个类别，推荐你在学习
Ada 做练习时采用这些准则。开始的时候，集中精力在准则本身和它的范例，
以养成好的编程习惯比理解每个准则的原理更重要。

准则的原理帮助有经验的程序员理解和接受准则中的建议。某些准则是为有经验的
程序员而写的，他们必须作出某些工程折衷。这在可移植性、可重用性和性能方面
特别突出。这些比较困难的准则和原理让你注意到影响编程决定的问题。当你成为
经验的 Ada 程序员的时候，你会注意到并作出工程折衷。

\section{给有经验的 Ada 程序员}
作为一个有经验的 Ada 程序员，你写的代码已经符合了许多本书的准则。但是，
在某些方面，你可能已经形成了自己的编程风格，与本书提到的准则不符，
而你可能不愿去改。仔细的回顾那些和你的风格不一致的准则，确认你了解它的原理，
并考虑采用。本书的准则汇集了一套可靠的方法以完成高质量的程序，太多的
异例会削弱它。

一致性是另一个全面采用通用准则的重要原因。如果项目中所有的人都用同一风格
来写代码，项目中许多重要的活动会变得容易。一致的代码，令正式、非正式的代码
复核、系统整合、项目中代码的重用、提供和使用支持工具变得简化。实践中，
公司或项目的标准也许有和准则不符的地方，这需要特别列出，所以采用非标准
的方法需要更多的工作。

本书中的某些准则集中在设计中的折衷上，特别是有关并行性、可移植性、可重用性、
面向对象的功能和性能的章节。这些准则要求你考虑，在应用中使用某个 Ada 功能
是否是合适的设计决定。通常会有几种方法来实现某个特定的设计决定，你在做决定
的时候要考虑这些准则讨论的各种折衷方案。

\section{给有经验的面向对象的程序员}
作为一个有经验的向对象的程序员，你将会欣赏为简洁的扩展 Ada 语言，使其包含强大
的面向对象的功能，所做的努力。这些新功能和现有的语言功能和语汇紧密的整合在
一起。本书特意从风格的角度来写，所以 Ada 面向对象的功能在全书中都有使用。
规约的使用这些功能有助于程序更容易的阅读和修改。这些功能让你可以灵活的构造
可重用构件。第\ref{c:obj-oriented}章针对面向对象的编程，以及继承和多形
中的问题。其他章节会互相对照第\ref{c:obj-oriented}章的准则。

如果你做过面向对象的设计，你将更容易的利用第\ref{c:obj-oriented}章中的许多
概念。一个面向对象的设计包含了一套有意义的抽象和分级结构的类。抽象应该包括
设计对象的定义，即结构和状态、对象的操作以及每个对象的封装。如何设计这些抽象
和分级结构的类超出了本书的范围。有许多很好的文献讨论这个问题，例如：
\cite{rumbaugh91}、\cite{jacobson92}、《ADARTS 指南》\cite{spc93}和
\cite{booch94}。

\section{给软件项目经理}
技术的管理在保证生产的软件的正确性、可靠性、可维护性和可移植性中具有重要
的地位。管理层必须为生产高质量的产品建立一套项目范围的约定：定义针对项目
的代码标准和准则; 让所有人理解为什么保持选定标准对产品品质的重要性; 同时建立
政策和程序来检查和实施这些标准。本书中的准则有助于这方面的努力。

经理的一个重要工作就是定义一个公司或项目的代码标准。这些准则本身并不构成
一套完整的标准，但是它们可以作为标准的基础。有几个准则指出了好几个决定，
但没有指定其中的某个。例如，本书中的\glemph{准则} \cite{g:src:format}
提倡使用一致的定数空格来缩进代码，在原理中指出两个或四个空格都可以。
和你的资深技术员工一起回顾这些准则，以确定公司或项目标准中所用的例示。

指定标准中， 还有两个方面需要管理层的决定。\glemph{准则}
\cite{g:readabilty:abbr} 建议你为对象或单元命名时，避免使用任意的缩略语。
你应当为此准备一个词汇表，列出项目中允许使用的专有缩略语, 例如 FFT 是 Fast
Fourier Transform (快速傅利叶变换)，SPN 是 Stochastic Peri Net (随机
佩特里网)。这个词汇表应当尽可能的短小，只包含要经常在名字中出现的术语。
如果需要经常的使用大规模的词汇表，那令代码难以阅读。

第\cite{c:portability}章有关可移植性的准则需要格外的注意。即使现在看不到
软件产品的移植需要，遵守这些准则还是很重要的。这提高了软件在
其它使用不同 Ada 实现的项目中重用的可能。当在某个项目中，某些准则必须被
放松，你应该坚持把不可移植部分的功能代码显著的标示出来。
第\cite{c:portability}章中的准则要求在项目或公司中定义和标准化
项目或公司特有的数字类型，来代替语言中预定义的数字类型 (有不可移植的可能)。

你在标准化中遇到的问题和决定，应该记录在项目或公司的代码标准文档中。有了恰当的
标准，你要保证大家都遵守。取得编程人员诚心的承诺去使用标准非常的关键。有了这
个承诺和程序员写的高质量的 Ada 程序范例，进行有效的针对项目标准符合性的正式
代码审核会容易很多。

一些有关 Ada 项目管理的普遍问题在\cite{hefley92}中有讨论。

\section{给承包商和标准制定组织}
本书中的许多准则都很有针对性，可以采用作为公司或项目的编程标准。其它的
需要管理上决定应用某个实例才能采用，这种情况下，会有一个样本实例，并在
范例中使用。这样的实例应当看作比准则要弱。某些情况下，例子是从公开的资料
中取得的，作者的风格被保留而没有修改。

书中的某些准则特意从设计选择的角度来写。这些准则不能被直接变成项目的规约
来实施。例如\glemph{准则}\cite{c:concurrency:pro-obj}和\cite{c:concurrency:task}
不能被认为项目中不能用任务。反而，这些准则有助于设计者在使用被保护对象还是
任务中作出折衷，从而作出更有依据的选择。

本书中的准则并不能只凭自己而成为标准。某些情况下，某个准则能不能实施
还是个问题，因为它只是要引起工程师注意其中的折衷。其它情况，准则中还有需要
选择的地方，如每一级的缩进需要多少空格。

当一个准则太概略而不能给出范例，它的\glemph{实例}部分含有更有针对性的准则。
标准中可以采用这些实例，因为它们更容易被实施。任何试图从本书中摘录出
内容作为标准的组织应该衡量所有的上下文。只有和其相关的准则一起使用，才能
发挥每条准则的最大功效。孤立出来，一条准则也许只有很少甚至没有效用。

\section{给从 Ada 83 过渡到 Ada 95 的计划者}
过渡的问题主要有两类：语言的不兼容，特别是向上兼容，以及语言新功能的利用。

向上兼容是 Ada 95 设计时的主要目标。实践中很可能遇到一些 Ada 83 和 Ada 95
不兼容的情况，这些情况很容易就可以克服 (参见\cite{rational95}的
\href{http://www.adaic.com/standards/95rat/RAThtml/rat95-p4-x.html}{附录X：
向上兼容}\footnote{http://http://www.adaic.com/standards/95rat/RAThtml/rat95-p4-x.html})。兼容问题的进一步信息还可参考\cite{taylor95}和\cite{interm95}。

过渡计划者可以从两方面深入了解如何利用语言功能。首先列表\ref{t:impact}
列出 Ada 95 的新功能对风格指南章节的影响。另外附录\ref{a:maps} 作了
\cite{arm95}中的章节到本书中准则的映射。

\section{排版规约}
有待翻译结束再更新。

\clearpage

\begin{table}[htp]
\caption{Ada 95 的新功能对风格指南章节的影响}
\label{t:impact}
\vspace{0.5em}
\footnotesize{
\begin{tabular}[htp]{|l|c|c|c|c|c|c|c|c|c|}
\hline
Ada 95 功能和增强&代码&可读&结构&实践&并行&移植&重用&面向对象&性能\\
\hline
面向对象功能& & & & & & & & & \\
\hline
\hspace{1em}类型扩展 (标签类型)&\checkmark&\checkmark& &\checkmark & & &\checkmark&\checkmark& \\
\hline
\hspace{1em}管制类型& & & & & & &\checkmark&\checkmark& \\
\hline
\hspace{1em}多形& & & &\checkmark& & &\checkmark&\checkmark&\checkmark \\
\hline
\hspace{1em}多重继承& & & & & & & &\checkmark& \\
\hline
\hspace{1em}抽象类型和子程序& & & & & & & &\checkmark& \\
\hline

程序结构和编译& & & & & & & & & \\
\hline
\hspace{1em}子单元库& &\checkmark&\checkmark& & & & & & \\
\hline
\hspace{1em}通用模板& & &\checkmark& & & &\checkmark& & \\
\hline

任务模型修订& & & & & & & & & \\
\hline
\hspace{1em}被保护类型& &\checkmark&\checkmark& &\checkmark&\checkmark& & & \\
\hline
\hspace{1em}同步机制&\checkmark& &\checkmark& &\checkmark&\checkmark& & & \\
\hline

说明和类型& & & & & & & & & \\
\hline
\hspace{1em}子程序访问类型& & & & & &\checkmark&\checkmark& & \\
\hline
\hspace{1em}访问类型& & & &\checkmark& & & & & \\
\hline

其它变动& & & & & & & & &\\
\hline
\hspace{1em}异例& &\checkmark&\checkmark&\checkmark& &\checkmark& & &\\
\hline
\hspace{1em}类型使用和重命名& & &\checkmark&\checkmark& & & & & \\
\hline
\hspace{1em}与其它语言的接口& & & & & &\checkmark& & & \\
\hline

专门的附录& & & & & & & & &\\
\hline
\hspace{1em}系统编程& & & & &\checkmark&\checkmark& & & \\
\hline
\hspace{1em}实时系统& & & & &\checkmark&\checkmark& & &\checkmark\\
\hline
\hspace{1em}分布式系统& & & & &\checkmark&\checkmark& & &\checkmark\\
\hline
\hspace{1em}信息系统& &\checkmark& &\checkmark& &\checkmark& & &\\
\hline
\hspace{1em}数值& &\checkmark& &\checkmark& &\checkmark& & &\\
\hline
\hspace{1em}安全和防备& &\checkmark& &\checkmark&\checkmark&\checkmark& & &\checkmark\\
\hline
\end{tabular}
}
\end{table}
